From: Andrew Cooper Date: Mon, 23 Jul 2018 13:29:27 +0000 (+0100) Subject: x86/spec-ctrl: Fix the parsing of xpti= on fixed Intel hardware X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~3556 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=be5e2ff6f54e0245331ed360b8786760f82fd673;p=xen.git x86/spec-ctrl: Fix the parsing of xpti= on fixed Intel hardware The calls to xpti_init_default() in parse_xpti() are buggy. The CPUID data hasn't been fetched that early, and boot_cpu_has(X86_FEATURE_ARCH_CAPS) will always evaluate false. As a result, the default case won't disable XPTI on Intel hardware which advertises ARCH_CAPABILITIES_RDCL_NO. Simplify parse_xpti() to solely the setting of opt_xpti according to the passed string, and have init_speculation_mitigations() call xpti_init_default() if appropiate. Drop the force parameter, and pass caps instead, to avoid redundant re-reading of MSR_ARCH_CAPS. Signed-off-by: Andrew Cooper Reviewed-by: Juergen Gross Reviewed-by: Wei Liu Acked-by: Jan Beulich --- diff --git a/xen/arch/x86/spec_ctrl.c b/xen/arch/x86/spec_ctrl.c index 73dc7170c7..32a4ea6e99 100644 --- a/xen/arch/x86/spec_ctrl.c +++ b/xen/arch/x86/spec_ctrl.c @@ -423,17 +423,10 @@ static bool __init should_use_eager_fpu(void) #define OPT_XPTI_DEFAULT 0xff uint8_t __read_mostly opt_xpti = OPT_XPTI_DEFAULT; -static __init void xpti_init_default(bool force) +static __init void xpti_init_default(uint64_t caps) { - uint64_t caps = 0; - - if ( !force && (opt_xpti != OPT_XPTI_DEFAULT) ) - return; - if ( boot_cpu_data.x86_vendor == X86_VENDOR_AMD ) caps = ARCH_CAPABILITIES_RDCL_NO; - else if ( boot_cpu_has(X86_FEATURE_ARCH_CAPS) ) - rdmsrl(MSR_ARCH_CAPABILITIES, caps); if ( caps & ARCH_CAPABILITIES_RDCL_NO ) opt_xpti = 0; @@ -446,8 +439,6 @@ static __init int parse_xpti(const char *s) const char *ss; int val, rc = 0; - xpti_init_default(false); - do { ss = strchr(s, ','); if ( !ss ) @@ -465,7 +456,7 @@ static __init int parse_xpti(const char *s) default: if ( !strcmp(s, "default") ) - xpti_init_default(true); + opt_xpti = OPT_XPTI_DEFAULT; else if ( (val = parse_boolean("dom0", s, ss)) >= 0 ) opt_xpti = (opt_xpti & ~OPT_XPTI_DOM0) | (val ? OPT_XPTI_DOM0 : 0); @@ -627,7 +618,9 @@ void __init init_speculation_mitigations(void) if ( default_xen_spec_ctrl ) setup_force_cpu_cap(X86_FEATURE_SC_MSR_IDLE); - xpti_init_default(false); + if ( opt_xpti == OPT_XPTI_DEFAULT ) + xpti_init_default(caps); + if ( opt_xpti == 0 ) setup_force_cpu_cap(X86_FEATURE_NO_XPTI); else